package image_utils

import (
	"image"
	"image/color"
	"image/jpeg"
	"math"
	"os"
)

// 判断颜色是否与白色相近
func isSimilarToWhite(c color.Color) bool {
	r, g, b, _ := c.RGBA()
	// 将颜色值转换到0-1范围内
	rf := float64(r) / 0xffff
	gf := float64(g) / 0xffff
	bf := float64(b) / 0xffff
	// 计算颜色与白色的欧几里得距离
	distance := math.Sqrt(math.Pow(rf-1, 2) + math.Pow(gf-1, 2) + math.Pow(bf-1, 2))
	// 如果距离小于某个阈值，认为颜色与白色相近
	return distance < 0.4
}

func FilterColor(imagePath string) error {
	// 读取图片文件
	file, err := os.Open(imagePath)
	if err != nil {
		return err
	}
	defer file.Close()
	// 解码图片
	img, _, err := image.Decode(file)
	if err != nil {
		return err
	}
	// 创建一个新的图片，与原始图片大小和模式相同
	bounds := img.Bounds()
	newImg := image.NewRGBA(bounds)
	// 遍历原始图片的每个像素
	for x := bounds.Min.X; x < bounds.Max.X; x++ {
		for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
			// 获取当前像素的颜色
			pixel := img.At(x, y)
			if isSimilarToWhite(pixel) {
				newImg.Set(x, y, color.White)
			} else {
				newImg.Set(x, y, color.Transparent)
			}
		}
	}
	// 创建输出文件
	outFile, err := os.Create("output.jpg")
	if err != nil {
		panic(err)
	}
	defer outFile.Close()
	// 将处理后的图片编码并保存到输出文件
	if err := jpeg.Encode(outFile, newImg, nil); err != nil {
		return err
	}
	return nil
}

func FilterColorSimilar(img image.Image) bool {
	bounds := img.Bounds()
	first := img.At(bounds.Min.X, bounds.Min.Y)
	// 遍历原始图片的每个像素
	for x := bounds.Min.X; x < bounds.Max.X; x++ {
		for y := bounds.Min.Y; y < bounds.Max.Y; y++ {
			// 获取当前像素的颜色
			pixel := img.At(x, y)
			if !isColorSimilar(first, pixel, 1800) {
				return false
			}
		}
	}
	return true
}
